import { each } from '@antv/util'
let params = {
  '1': ['1', '2'],
  '2': ['2', '3'],
  '3': ['5'],
  '4': ['4'],
  '5': ['1', '2', 'l1'],
  '6': ['5']
}
let chartEncaps = {
  // 初始化柱状图，折线图
  initCanvas: opt => {
    // let opt = {
    //   _t: this,
    //   doms: 'mycharts'
    // }
    let pad = [
      opt._t.chartsConData.canvasTopPad,
      opt._t.chartsConData.canvasRightPad,
      opt._t.chartsConData.canvasBottomPad,
      opt._t.chartsConData.canvasLeftPad
    ]
    if (opt._t.chartsConData.autoFit) {
      chartEncaps.drawPublic({
        _t: opt._t,
        doms: opt.doms,
        data: {
          autoFit: true,
          padding: pad
        }
      })
    } else {
      let w = opt._t.chartsConData.canvasWidth
      let h = opt._t.chartsConData.canvasHeight
      if (w === '') {
        opt._t.setChartsConData({ canvasWidth: opt._t.chart.width })
      }
      if (h === '') {
        opt._t.setChartsConData({ canvasHeight: opt._t.chart.height })
      }
      chartEncaps.drawPublic({
        _t: opt._t,
        doms: opt.doms,
        data: {
          autoFit: false,
          width: w !== '' ? w : opt._t.chart.width,
          height: h !== '' ? h : opt._t.chart.height,
          padding: pad
        }
      })
    }
  },
  // 处理事件格式
  dealDate: opt => {
    // let opt = {
    //   _t: this
    // }
    let data = opt._t.chartData
  },
  // 处理显示年月数据
  dealWithData: opt => {
    // let opt = {
    //   _t: this
    // }
    let newData = []
    if (
      opt._t.chartsConData.ways === '2' ||
      opt._t.chartsConData.ways === '5'
    ) {
      switch (opt._t.chartsConData.type1) {
        case 'z1':
        case 'z4':
        case 'l2':
          newData = subDealData({ _t: opt._t, key: 'label' })
          break
        case 'z2':
          opt._t.chartData.forEach((item, index) => {
            let keys = {}
            let i = ''
            for (let key in item) {
              if (key === 'name') {
                keys[key] = item[key]
                continue
              }
              // 2020031712
              if (opt._t.chartsConData.showYear === '1') {
                i = ' ' + key.substring(0, 4)
                switch (opt._t.chartsConData.dateFormat) {
                  case '1':
                    i += '年'
                    break
                  case '2':
                    i += '/'
                    break
                }
              } else {
                i = ''
              }
              if (opt._t.chartsConData.showMonth === '1') {
                i += parseInt(key.substring(4, 6))
                switch (opt._t.chartsConData.dateFormat) {
                  case '1':
                    i += '月'
                    break
                  case '2':
                    i += '/'
                    break
                }
              }
              if (
                opt._t.chartsConData.unit !== '3' &&
                opt._t.chartsConData.showDay === '1'
              ) {
                i += parseInt(key.substring(6, 8))
                switch (opt._t.chartsConData.dateFormat) {
                  case '1':
                    i += '日'
                    break
                  case '2':
                    break
                }
              }
              if (
                opt._t.chartsConData.unit === '2' &&
                opt._t.chartsConData.showHour === '1'
              ) {
                i += ' ' + parseInt(key.substring(8))
                switch (opt._t.chartsConData.dateFormat) {
                  case '1':
                    i += '时'
                    break
                  case '2':
                    i += 'h'
                    break
                }
              }
              if (i.substring(i.length - 1) === '/') {
                i = i.replace(/(.*)\//, '$1')
              }

              keys[i] = item[key]
            }
            newData.push(keys)
          })
          break
        case 'l1':
        case 'z3':
          newData = subDealData({ _t: opt._t, key: 'year' })
          break
      }
    }
    return newData.length > 0 ? newData : [...opt._t.chartData]
  },
  // 设置单位
  handleTickCount: opt => {
    // let opt = {
    //   _t: this
    // }
    let p = {
      label: {
        offset: 20,
        style: {
          fill: '#555', // 文本的颜色
          fontSize: opt._t.chartsConData.textSize // 文本大小
        }
      },
      tickLine: {
        lineWidth: 1 // 刻度线宽
      },
      line: {
        stroke: '#dedede'
      }
    }
    var p1 = p
    var p2 = p
    if (
      opt._t.chartsConData.ways === '2' ||
      (opt._t.chartsConData.ways === '5' && opt._t.chartsConData.type1 !== 'l2')
    ) {
      let len = 0
      if (
        opt._t.chartsConData.ways === '5' &&
        opt._t.chartsConData.type1 === 'z2'
      ) {
        if (opt._t.chartData[0]) {
          len = Object.keys(opt._t.chartData[0]).length
        }
        len =
          opt._t.chartsConData.tickCount === ''
            ? len
            : opt._t.chartsConData.tickCount
      } else {
        len =
          opt._t.chartsConData.tickCount === ''
            ? opt._t.chartData.length
            : opt._t.chartsConData.tickCount
      }
      let list = {}
      let u = opt._t.chartsConData.timeUnitFlag
        ? opt._t.chartsConData.timeUnit
        : setUnit(opt)
      opt._t.setChartsConData({ timeUnit: u })
      list[opt.data.field] = {
        alias: opt._t.chartsConData.timeUnit,
        tickCount: len
      }
      opt._t.chart.scale(list)
      p = {
        label: {
          offset: 20,
          style: {
            fill: '#555', // 文本的颜色
            fontSize: opt._t.chartsConData.textSize // 文本大小
          }
        },
        tickLine: {
          lineWidth: 1 // 刻度线宽
        },
        line: {
          stroke: '#dedede'
        }
      }

      p2 = {
        title: {
          autoRotate: false,
          style: {
            fill: '#555', // 文本的颜色
            fontSize: opt._t.chartsConData.textSize // 文本大小
          },
          position: 'end'
        },
        ...p
      }
      if (opt._t.chartsConData.timeUnit === '') {
        p1 = p
      } else {
        p1 = {
          title: {
            autoRotate: false,
            style: {
              fill: '#555', // 文本的颜色
              fontSize: opt._t.chartsConData.textSize // 文本大小
            },
            position: 'end'
          },
          ...p
        }
      }
    }
    opt._t.chart.scale(opt.data.value, {
      alias: opt._t.chartsConData.valueUnit + '\n\n',
      min: 0
    })
    opt._t.chart.axis(opt.data.field, p1)
    opt._t.chart.axis(opt.data.value, p2)
  },
  // 创建charts
  drawPublic: opt => {
    // opt = {
    //   _t: this,
    //   doms: 'mycharts',
    //   data:{ padding: [50, 0, 20, 0], autoFit: true }
    // }
    let dom1 = opt._t.$refs.drawCharts
    let ww = opt._t.$refs.mycharts
    if (ww.innerHTML !== '') {
      ww.innerHTML = ''
    }
    let w = dom1.offsetWidth
    let h =
      opt._t.chartsConData.ways === '1'
        ? dom1.offsetHeight - 90
        : dom1.offsetHeight
    let obj = {
      container: opt.doms,
      autoFit: opt.data.autoFit || false,
      width: w,
      height: h,
      padding: opt.data.padding ? opt.data.padding : 100
    }
    obj = opt.data ? { ...obj, ...opt.data } : obj
    opt._t.chart = new opt._t.$Chart(obj)
  },
  // 设置图例的显示隐藏
  setLegend: opt => {
    // let opt = {
    //   _t: this,
    //   data: data
    // }
    if (opt._t.chartsConData.legend === '1') {
      let style = {
        fill: '#555',
        fontSize: opt._t.chartsConData.textSize
      }
      if (opt._t.dropData === 'b1') {
        opt._t.chart.legend('type', false)
        opt._t.chart.legend('label', {
          flipPage: false,
          position: opt._t.chartsConData.legendPosition,
          offsetX: opt._t.chartsConData.legendOffsetX,
          offsetY: opt._t.chartsConData.legendOffsetY,
          itemName: {
            style
          }
        })
      } else if (Number(opt._t.chartsConData.type) === 2) {
        opt._t.chart.legend(opt.data, {
          flipPage: false,
          position: opt._t.chartsConData.legendPosition,
          offsetX: opt._t.chartsConData.legendOffsetX,
          offsetY: opt._t.chartsConData.legendOffsetY,
          itemName: {
            style
          }
        })
      } else if (opt._t.chartsConData.type1 === 'd1') {
        opt._t.chart.legend(opt.data, {
          flipPage: false,
          position: 'left-bottom',
          itemName: {
            style
          }
        })
      } else {
        opt._t.chart.legend(opt.data, {
          position: opt._t.chartsConData.legendPosition,
          offsetX: opt._t.chartsConData.legendOffsetX,
          offsetY: opt._t.chartsConData.legendOffsetY,
          flipPage: false,
          itemName: {
            style
          }
        })
      }
    } else {
      opt._t.chart.legend(false)
    }
  },
  // 设置中国下面的各省市
  setJson: opt => {
    return new Promise(resolve => {
      if (Number(opt._t.chartsConData.statAreaAttr) === 380) {
        opt._t.chartsConData.thumbnail === '1'
          ? resolve(opt._t.geoJson)
          : resolve(opt._t.geoJsonAll)
      } else {
        let newArr = opt._t.areaList.filter(
          item => item.id === Number(opt._t.chartsConData.statAreaAttr)
        )
        let arr = opt._t.geoJson.features.filter(
          item => item.properties.name === newArr[0].name
        )
        opt._t.$axios
          .get('/chart/queryGeoJson?adcode=' + arr[0].properties.adcode)
          .then(res => {
            resolve(JSON.parse(res.data.message))
          })
      }
    }).catch(err => {
      console.log(err)
    })
  },
  // 设置绘图的样式
  setDisplay: opt => {
    // opt = {
    //   doms: 'mycharts',
    //   display:'block'
    // }
    let mycharts = document.querySelector('.' + opt.doms)
    let doms = document.querySelector('.' + opt.doms + '>div')
    if (opt.display === 'block') {
      mycharts.style.display = 'block'
    } else {
      mycharts.style.display = 'table'
      doms.style.display = 'table-cell'
      doms.style.verticalAlign = 'middle'
    }
  },
  //  设置百分比，去除百分比为0的数据
  setPercent: opt => {
    let newArray = []
    if (opt._t.chartsConData.percent === '1') {
      newArray = opt.data.filter(item => item.percent > 0)
    } else {
      newArray = opt.data.filter(item => item.value > 0)
    }
    return [...newArray]
  },
  // 将数据转换为百分比
  setPercentValue: opt => {
    let nd = opt._t.chartData
    let newData1 = []
    let newData2 = []
    for (let i in nd) {
      newData1.push(nd[i].value)
    }
    for (let j in newData1) {
      newData2[j] = getPercentValue(newData1, j, opt._t.chartsConData.precision)
    }
    for (let h in nd) {
      nd[h].percent = newData2[h++]
    }
    return nd
  },
  setOffset: opt => {
    let m = 0
    let offset = []
    let offsetX = []
    let offsetY = []
    for (let i = 0; i < opt._t.chartData.length; ) {
      m = 0
      let dd = opt._t.chartsConData.bOffset[opt._t.chartData[i].label]
      if (opt._t.chartData[i].percent < 10) {
        offset.push(dd.offset)
        offsetX.push(dd.offsetX)
        offsetY.push(dd.offsetY)
        setBoffset(i)
        for (let j = i + 1; j < opt._t.chartData.length; j++) {
          let dd = opt._t.chartsConData.bOffset[opt._t.chartData[j].label]
          if (opt._t.chartData[j].percent < 10) {
            m++
            offset.push(
              dd.offset !== 20
                ? dd.offset
                : dd.offset + Number(opt._t.chartsConData.textSize) * m + 10
            )
            offsetY.push(dd.offsetY !== 0 ? dd.offsetY : 0)
            offsetX.push(dd.offsetY !== 0 ? dd.offsetX : 0)
            setBoffset(j)
            i++
          } else {
            i++
            offset.push(dd.offset)
            offsetY.push(dd.offsetY)
            offsetX.push(dd.offsetX)
            setBoffset(i)
            break
          }
        }
      } else {
        offset.push(dd.offset)
        offsetY.push(dd.offsetY)
        offsetX.push(dd.offsetX)
        setBoffset(i)
      }
      i++
    }
    return {
      offset,
      offsetX,
      offsetY
    }

    function setBoffset(i) {
      let obj = {}
      obj[opt._t.chartData[i].label] = {
        offset: offset[offset.length - 1],
        offsetY: offsetY[offsetY.length - 1],
        offsetX: offsetX[offsetX.length - 1]
      }
      obj = { ...opt._t.chartsConData.bOffset, ...obj }
      opt._t.setChartsConData({ bOffset: obj })
    }
  },
  // 设置饼状图公用属性
  setBattr: opt => {
    // opt = {
    //   _t: this,
    //   data: { data }

    // let { offset, offsetX, offsetY } = chartEncaps.setOffset({ _t: opt._t })
    let m = 0
    opt._t.chart
      .interval()
      .adjust('stack')
      .position(opt.data.y)
      .color(opt.data.x, opt._t.color)
      .label('percent', percent => {
        // layout: {
        //     // type: opt._t.chartsConData.layout
        //     type: 'overlap'
        // },
        m = m + 1
        return {
          offset: opt._t.chartsConData.offset,
          // offset: offset[m - 1],
          // offsetX: offsetX[m - 1],
          // offsetY: offsetY[m - 1],
          content: obj => {
            let result
            switch (opt._t.chartsConData.type1) {
              case 'b2':
              case 'b3':
              case 'b6':
                if (opt.data.z) {
                  result =
                    obj[opt.data.x] +
                    '：' +
                    obj[opt.data.y] +
                    '，' +
                    obj[opt.data.z].toFixed(opt._t.chartsConData.precision) +
                    '%'
                } else {
                  result =
                    obj[opt.data.x] +
                    '：' +
                    (opt.data.y === 'percent'
                      ? obj[opt.data.y].toFixed(
                          opt._t.chartsConData.precision
                        ) + '%'
                      : obj[opt.data.y])
                }
                break
              case 'b4':
                if (opt.data.z) {
                  result =
                    obj[opt.data.y] +
                    '，' +
                    obj[opt.data.z].toFixed(opt._t.chartsConData.precision) +
                    '%'
                } else {
                  result =
                    opt.data.y === 'percent'
                      ? obj[opt.data.y].toFixed(
                          opt._t.chartsConData.precision
                        ) + '%'
                      : obj[opt.data.y]
                }
                break
            }
            return result
          },
          style: {
            fill: '#555', // 文本的颜色
            stroke: '',
            fontSize: opt._t.chartsConData.textSize // 文本大小
          }
        }
      })
  },
  // 是否可以绘制
  ifDraw: opt => {
    let f = false
    let key = opt.ways ? opt.ways : opt._t.chartsConData.ways
    if (key) {
      f = params[key].some(item => {
        return (
          opt._t.chartsConData.type === item ||
          opt._t.chartsConData.type1 === item
        )
      })
    }

    return f
  },
  setTjData: opt => {
    // opt = { _t: this }
    let total = 0
    if (opt._t.chartsConData.ways === '1') {
      for (let i in opt._t.chartData) {
        total += Number(opt._t.chartData[i].value)
      }
    }
    return total
  }
}
// 按时间绘制时设置单位
function setUnit(opt) {
  // let opt = {
  //   _t: this
  // }
  // 单位，1--天， 2--小时 3--月
  let timeUnit = ''
  let unitArr = {
    '1': ['showDay', 'showMonth', 'showYear'],
    '2': ['showHour', 'showDay', 'showMonth', 'showYear'],
    '3': ['showMonth', 'showYear']
  }
  let unit = opt._t.chartsConData.unit
  let u = unitArr[unit].find(item => opt._t.chartsConData[item] === '1')
  switch (u) {
    case 'showDay':
      timeUnit = '单位/日'
      break
    case 'showHour':
      timeUnit = '单位/时'
      break
    case 'showMonth':
      timeUnit = '单位/月'
      break
    case 'showYear':
      timeUnit = '单位/年'
      break
    default:
      timeUnit = ''
  }
  return timeUnit
}
// 传入参数（数组数据，数组下标，精度），
function getPercentValue(valueList, idx, precision) {
  // 判断是否为空
  if (!valueList[idx]) {
    return 0
  }
  // 求和
  var sum = valueList.reduce((acc, val) => {
    return acc + (isNaN(val) ? 0 : val)
  }, 0)
  if (sum === 0) {
    return 0
  }
  // 10的2次幂是100，用于计算精度。
  var digits = Math.pow(10, precision)
  // 扩大比例100，
  var votesPerQuota = valueList.map(val => {
    return ((isNaN(val) ? 0 : val) / sum) * digits * 100
  })
  // 总数，扩大比例意味的总数要扩大
  var targetSeats = digits * 100
  // 再向下取值，组成数组
  var seats = votesPerQuota.map(votes => {
    return Math.floor(votes)
  })
  // 再新计算合计，用于判断与总数量是否相同，相同则占比会100%
  var currentSum = seats.reduce((acc, val) => {
    return acc + val
  }, 0)
  // 余数部分的数组：原先数组减去向下取值的数组，得到余数部分的数组
  var remainder = votesPerQuota.map((votes, idx) => {
    return votes - seats[idx]
  })
  // 给最大最大的余额加1，凑个占比100%；
  while (currentSum < targetSeats) {
    //  找到下一个最大的余额，给其加1
    var max = Number.NEGATIVE_INFINITY
    var maxId = null
    for (var i = 0, len = remainder.length; i < len; ++i) {
      if (remainder[i] > max) {
        max = remainder[i]
        maxId = i
      }
    }
    // 对最大项余额加1
    ++seats[maxId]
    // 已经增加最大余数加1，则下次判断就可以不需要再判断这个余额数。
    remainder[maxId] = 0
    // 总的也要加1，为了判断是否总数是否相同，跳出循环。
    ++currentSum
  }
  // 这时候的seats就会总数占比会100%
  return seats[idx] / digits
}

function subDealData(opt) {
  // let opt = {
  //   _t: this,
  //   key: key
  // }
  let newData = []
  opt._t.chartData.forEach((item, index) => {
    let label
    if (opt._t.chartsConData.showYear === '1') {
      label = ' ' + parseInt(item[opt.key].substring(0, 4))
      switch (opt._t.chartsConData.dateFormat) {
        case '1':
          label += '年'
          break
        case '2':
          label += '/'
          break
      }
    } else {
      label = ''
    }
    if (opt._t.chartsConData.showMonth === '1') {
      label += parseInt(item[opt.key].substring(4, 6))
      switch (opt._t.chartsConData.dateFormat) {
        case '1':
          label += '月'
          break
        case '2':
          label += '/'
          break
      }
    }
    if (
      opt._t.chartsConData.unit !== '3' &&
      opt._t.chartsConData.showDay === '1'
    ) {
      label += parseInt(item[opt.key].substring(6, 8))
      switch (opt._t.chartsConData.dateFormat) {
        case '1':
          label += '日'
          break
        case '2':
          break
      }
    }
    if (
      opt._t.chartsConData.unit === '2' &&
      opt._t.chartsConData.showHour === '1'
    ) {
      label += parseInt(item[opt.key].substring(8))
      switch (opt._t.chartsConData.dateFormat) {
        case '1':
          label += '时'
          break
        case '2':
          label += 'h'
          break
      }
    }
    if (label.substring(label.length - 1) === '/') {
      label = label.replace(/(.*)\//, '$1')
    }
    if (
      opt._t.chartsConData.type1 === 'z1' ||
      opt._t.chartsConData.type1 === 'z4' ||
      opt._t.chartsConData.type1 === 'l2'
    ) {
      newData.push({ label: label, value: item.value })
    }
    if (
      opt._t.chartsConData.type1 === 'z3' ||
      opt._t.chartsConData.type1 === 'l1'
    ) {
      newData.push({ name: item.name, year: label, value: item.value })
    }
  })
  return newData
}
export { chartEncaps }
